#!/bin/bash

# =============================================================================
# 文件同步脚本
# 作者: ShineZhang
# 日期: 2024年12月
# 描述: 该脚本用于在本地和远程计算机之间同步文件夹，包括增量同步和删除同步。
# =============================================================================

# 配置颜色
RESET_COLOR="\033[0m"
GREEN="\033[32m"
YELLOW="\033[33m"
RED="\033[31m"
CYAN="\033[36m"
BOLD="\033[1m"
UNDERLINE="\033[4m"

# 配置远程主机信息
REMOTE_USER="xxx"              # 远程主机登录用户名
REMOTE_HOST="42.193.219.111"    # 远程主机IP
SSH_PORT="6000"                 # 远程主机SSH自定义端口，默认22
REMOTE_PASSWORD="xxx"             # 远程主机登录密码

# 远程主机传输路径
REMOTE_PATH="/home/joke/scp"

# 本地路径
LOCAL_PATH="/home/joke/scp"

# 分隔符
LINE="========================================================"

# 使用帮助信息
function show_help() {
  echo -e "${BOLD}${GREEN}${LINE}${RESET_COLOR}"
  echo -e "${BOLD}${GREEN} 文件同步脚本 ${RESET_COLOR}"
  echo -e "${BOLD}${GREEN}${LINE}${RESET_COLOR}"
  echo -e "用法: $0 [选项]"
  echo -e "${BOLD}${YELLOW}选项:${RESET_COLOR}"
  echo -e "  -r              从远程主机同步文件到本地"
  echo -e "  -u              将本地文件同步到远程主机"
  echo -e "  -h, --help      显示此帮助信息"
  echo -e ""
  echo -e "示例:"
  echo -e "  从远程主机同步文件到本地: $0 -r"
  echo -e "  上传本地文件到远程主机: $0 -u"
  echo -e "${BOLD}${GREEN}${LINE}${RESET_COLOR}"
  exit 0
}

# 检查是否提供了选项
if [ -z "$1" ]; then
  echo -e "${RED}错误: 请提供同步选项。${RESET_COLOR}"
  show_help
fi

# 打印远程主机信息
function print_remote_info() {
  echo -e "${CYAN}${BOLD}${LINE}${RESET_COLOR}"
  echo -e "${BOLD}远程主机信息${RESET_COLOR}"
  echo -e "${CYAN}${BOLD}${LINE}${RESET_COLOR}"
  echo -e "  ${UNDERLINE}用户名${RESET_COLOR}: $REMOTE_USER"
  echo -e "  ${UNDERLINE}主机地址${RESET_COLOR}: $REMOTE_HOST"
  echo -e "  ${UNDERLINE}远程路径${RESET_COLOR}: $REMOTE_PATH"
  echo -e "  ${UNDERLINE}SSH端口${RESET_COLOR}: $SSH_PORT"
  echo -e "${CYAN}${BOLD}${LINE}${RESET_COLOR}"
}

# 检查并安装 rsync 和 sshpass
if ! command -v rsync &> /dev/null; then
  echo -e "${YELLOW}警告: rsync 未安装，正在安装...${RESET_COLOR}"
  sudo apt-get install -y rsync
fi

if ! command -v sshpass &> /dev/null; then
  echo -e "${YELLOW}警告: sshpass 未安装，正在安装...${RESET_COLOR}"
  sudo apt-get install -y sshpass
fi

# 同步文件的函数
function sync_files() {
  local direction=$1
  if [ "$direction" == "download" ]; then
    # 从远程主机同步文件到本地
    echo -e "${CYAN}正在从远程主机 ${BOLD}$REMOTE_USER@$REMOTE_HOST${RESET_COLOR} 同步文件夹: ${BOLD}$REMOTE_PATH${RESET_COLOR} 到本地 ${BOLD}$LOCAL_PATH${RESET_COLOR} ..."
    
    # 这里我们保证同步整个远程路径到本地目标目录，并且删除本地多余文件
    sshpass -p "$REMOTE_PASSWORD" rsync -avz --delete --progress -e "ssh -p $SSH_PORT" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/" "$LOCAL_PATH/"
    
    if [ $? -eq 0 ]; then
      echo -e "${GREEN}文件同步成功！${RESET_COLOR}"
    else
      echo -e "${RED}文件同步失败！${RESET_COLOR}"
    fi
  elif [ "$direction" == "upload" ]; then
    # 将本地文件同步到远程主机
    echo -e "${CYAN}正在将本地文件夹 ${BOLD}$LOCAL_PATH${RESET_COLOR} 同步到远程主机 ${BOLD}$REMOTE_USER@$REMOTE_HOST${RESET_COLOR} 路径: ${BOLD}$REMOTE_PATH${RESET_COLOR} ..."
    
    # 这里我们保证同步整个本地目录到远程路径，并且删除远程多余文件
    sshpass -p "$REMOTE_PASSWORD" rsync -avz --delete --progress -e "ssh -p $SSH_PORT" "$LOCAL_PATH/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/"
    
    if [ $? -eq 0 ]; then
      echo -e "${GREEN}文件同步成功！${RESET_COLOR}"
    else
      echo -e "${RED}文件同步失败！${RESET_COLOR}"
    fi
  else
    echo -e "${RED}错误: 无效的同步选项。${RESET_COLOR}"
    show_help
  fi
}

# 打印远程主机信息
print_remote_info

# 根据选项执行同步操作
case "$1" in
  -r)
    sync_files "download"
    ;;
  -u)
    sync_files "upload"
    ;;
  -h|--help)
    show_help
    ;;
  *)
    echo -e "${RED}错误: 无效的选项。${RESET_COLOR}"
    show_help
    ;;
esac
